package com.amos.boot;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.io.FileUtils;

import java.io.File;
import java.io.IOException;
import java.nio.charset.Charset;

/**
 * DESCRIPTION: 中国省市区信息
 * <a title="中国省市区信息" href="https://github.com/airyland/china-area-data"/>
 *
 * @author amos.wang
 * @date 2019/5/28
 */
public class ChinaAreaMain {

    /**
     * 源文件路径（默认桌面）
     * https://github.com/airyland/china-area-data/blob/master/v4/data.json
     */
    private static final String ORIGINAL_FILE_PATH = "C:\\Users\\User\\Desktop\\data.json";
    /**
     * 要生成的文件（默认桌面）
     */
    private static final String NEW_FILE_PATH = "C:\\Users\\User\\Desktop\\area-data.js";

    private static JSONObject BASE_AREA_DATA = null;


    public static void main(String[] args) throws IOException {

        // JSON 文件里的原始数据
        String content = FileUtils.readFileToString(new File(ORIGINAL_FILE_PATH), "UTF-8");
        BASE_AREA_DATA = JSON.parseObject(content);
        if (BASE_AREA_DATA == null) {
            return;
        }

        // 1.拿到国内所有省份
        JSONObject chinaData = BASE_AREA_DATA.getJSONObject("86");

        // 1.1 获取省市区（递归）
        // JSONArray jsonArray = getChildrenArrayAll(chinaData);

        // 1.2 获取省市（未用递归）
        JSONArray jsonArray = getChildrenArray1(chinaData);

        String writeData = "export const areaData = " + jsonArray.toString();
        FileUtils.writeStringToFile(new File(NEW_FILE_PATH), writeData, Charset.forName("UTF-8"));

        System.out.println("写入成功!");
    }

    /**
     * 获取全部（三级省市区）
     * 递归生成 Element-UI >>>>> Cascader 级联选择器 原生支持的数据格式
     */
    private static JSONArray getChildrenArrayAll(JSONObject jsonObject) {
        if (jsonObject == null || jsonObject.size() == 0) {
            return null;
        }
        JSONArray childrenArray = new JSONArray();
        jsonObject.forEach((code, label) -> {
            JSONObject tempJSONObject = new JSONObject();
            tempJSONObject.put("label", label);
            tempJSONObject.put("value", label);
            tempJSONObject.put("children", getChildrenArrayAll(BASE_AREA_DATA.getJSONObject(code)));

            childrenArray.add(tempJSONObject);
        });

        return childrenArray;
    }

    /**
     * 单独获取（一级省）
     */
    private static JSONArray getChildrenArray1(JSONObject jsonObject) {
        if (jsonObject == null || jsonObject.size() == 0) {
            return null;
        }
        JSONArray childrenArray = new JSONArray();
        jsonObject.forEach((code, label) -> {
            JSONObject tempJSONObject = new JSONObject();
            tempJSONObject.put("label", label);
            tempJSONObject.put("value", label);
            tempJSONObject.put("children", getChildrenArray2(BASE_AREA_DATA.getJSONObject(code)));

            childrenArray.add(tempJSONObject);
        });

        return childrenArray;
    }

    /**
     * 单独获取（二级市）
     */
    private static JSONArray getChildrenArray2(JSONObject jsonObject) {
        if (jsonObject == null || jsonObject.size() == 0) {
            return null;
        }
        JSONArray childrenArray = new JSONArray();
        jsonObject.forEach((code, label) -> {
            JSONObject tempJSONObject = new JSONObject();
            tempJSONObject.put("label", label);
            tempJSONObject.put("value", label);

            childrenArray.add(tempJSONObject);
        });

        return childrenArray;
    }

}
